#ifndef VALUEENCODEDSOLUTION2D_H_
#define VALUEENCODEDSOLUTION2D_H_

#include "../Solution2d.h"

template <typename T=int>
class ValueEncodedSolution2d : public Solution2d
{
	public:
		ValueEncodedSolution2d();
        ValueEncodedSolution2d(vector<vector<T> >);
		virtual ~ValueEncodedSolution2d();
        
        Solution *clone();
        ostream &outputSolution(ostream &);
        void push(unsigned int, T);                   /**< Push an element onto the end of the specified row */
        void push(vector<T>);                         /**< Push a new row onto the solution. */
        T pop(unsigned int);                          /**< Pop an element off of the end of the specified row */
        vector<T> pop();                              /**< Pop the last row off the solution */
        void mutate();
        void setValue(unsigned int, unsigned int, T value);
        T getValue(unsigned int, unsigned int);
        vector<vector<T> > getSolution();
        unsigned int getRowCount();
        unsigned int getColumnCount(unsigned int);
    
    private:
        vector<vector<T> > solution;
};

#endif /*VALUEENCODEDSOLUTION2D_H_*/
